import com.class06.ioc_01.HelloDao;
import com.class06.ioc_01.HelloService;
import com.class06.ioc_02.JavaBean;
import com.class06.ioc_03.UserController;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTestIoc {
    @Test
    public void test() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-01.xml");
        HelloDao bean = context.getBean("haha", HelloDao.class);
        System.out.println(bean);
        HelloService helloService =
                context.getBean("helloService", HelloService.class);
        System.out.println("helloService = " + helloService);

    }


    private ClassPathXmlApplicationContext context;

    //    测试之前创建容器
    @BeforeEach   //创建容器  在测试方法前执行
    public void createIoc() {
        context = new ClassPathXmlApplicationContext("spring-02.xml");
    }

    @Test
    public void test2() {
        JavaBean javaBean = context.getBean("javaBean", JavaBean.class);
        JavaBean javaBean1 = context.getBean("javaBean", JavaBean.class);
        System.out.println(javaBean==javaBean1);

    }

    @AfterEach  //销毁容器  在测试方法后执行
    public void closeIoc() {
        context.close();
    }


//    @Test
//    public void test2(){
////        创建容器
//        ClassPathXmlApplicationContext context =
//                new ClassPathXmlApplicationContext("spring-02.xml");
//        JavaBean javaBean = context.getBean("javaBean", JavaBean.class);
////        关闭容器
//        context.close();
//
//    }

    @Test
    public void test3(){
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-03.xml");

        UserController userController =
                context.getBean("userController", UserController.class);
//        场景1：ioc容器中仅有一个UserService接口的实现类对象
        userController.show();

//        场景2：ioc容器中存在多个UserService接口的实现类对象
//        解决方式：
//        1）、多个实现类都实现同一个接口，可以定义具体实现类为注入属性类型
//        2）、如果定义注入类型为接口，并且有多个实现类时，
//        需要使用@Qualifier注解指定注入的bean的id


    }


    @Test
    public void test4(){
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-04.xml");
        com.class06.ioc_04.JavaBean javaBean =
                context.getBean("javaBean", com.class06.ioc_04.JavaBean.class);
        System.out.println(javaBean);

    }
}
